# import os
# import shutil
# import sys
# import re
#
#
# def get_user_input(prompt):
#     """安全获取用户输入（兼容中文路径）"""
#     try:
#         return input(prompt)
#     except UnicodeDecodeError:
#         return input(prompt.encode('gbk', 'ignore').decode('gbk'))
#
#
# def classify_and_move_directories(source_root, target_root):
#     """
#     将E盘下8位数字目录按前6位归类
#
#     规则说明：
#     - 目录名如 00204701 → 归类到 002047 目录下
#     - 目录名如 00204702 → 归类到 002047 目录下
#     - 最终结构: E:\目标路径\002047\00204701
#     """
#     # 验证源目录是否存在
#     if not os.path.exists(source_root):
#         print(f"错误: 源目录 '{source_root}' 不存在")
#         return
#
#     # 确保目标根目录存在
#     if not os.path.exists(target_root):
#         os.makedirs(target_root, exist_ok=True)
#
#     # 遍历源目录下的所有子目录
#     for dir_name in os.listdir(source_root):
#         source_dir = os.path.join(source_root, dir_name)
#
#         # 跳过非目录或非8位数字目录
#         if not os.path.isdir(source_dir):
#             continue
#
#         # 验证目录名是否为8位数字
#         if len(dir_name) != 8 or not dir_name.isdigit():
#             print(f"跳过: 目录名无效 - {dir_name} (需8位数字)")
#             continue
#
#         # 提取前6位作为归类目录名
#         category_dir = dir_name[:6]
#
#         # 构建目标路径
#         target_dir = os.path.join(target_root, category_dir, dir_name)
#
#         # 检查目标目录是否已存在
#         if os.path.exists(target_dir):
#             print(f"跳过: 目录已存在 - {dir_name} -> {target_dir}")
#             continue
#
#         # 创建归类目录（如果不存在）
#         os.makedirs(os.path.dirname(target_dir), exist_ok=True)
#
#         # 复制目录（包括所有子文件）
#         try:
#             shutil.copytree(source_dir, target_dir)
#             print(f"成功归类: {dir_name} -> {target_dir}")
#         except Exception as e:
#             print(f"错误: 复制 {dir_name} 时出错 - {str(e)}")
#
#
# def main():
#     """主程序入口"""
#     print("=" * 50)
#     print("目录归类工具 - 按前6位数字归类")
#     print("示例: 00204701 和 00204702 会归类到 002047 目录下")
#     print("=" * 50)
#
#     # 获取用户输入
#     source_root = get_user_input("\n请输入源目录路径 (如 E:\\): ")
#     target_root = get_user_input("请输入目标目录路径 (如 E:\\分类结果\\): ")
#
#     # 验证输入
#     if not os.path.exists(source_root):
#         print(f"\n错误: 源目录 '{source_root}' 不存在！")
#         print("请确保路径正确，包含反斜杠和引号（如 E:\\）")
#         sys.exit(1)
#
#     # 创建目标根目录（如果不存在）
#     if not os.path.exists(target_root):
#         os.makedirs(target_root, exist_ok=True)
#
#     # 执行目录归类
#     print(f"\n开始处理: 源目录 = {source_root}")
#     print(f"目标目录 = {target_root}\n")
#
#     # 遍历源目录下的所有子目录
#     total_dirs = 0
#     for dir_name in os.listdir(source_root):
#         if len(dir_name) == 8 and dir_name.isdigit():
#             total_dirs += 1
#
#     print(f"检测到 {total_dirs} 个8位数字目录，开始归类处理...")
#
#     classify_and_move_directories(source_root, target_root)
#
#     print(f"\n目录归类完成！共处理 {total_dirs} 个目录")
#
#
# if __name__ == "__main__":
#     # 适配PyInstaller打包
#     if getattr(sys, 'frozen', False):
#         base_dir = sys._MEIPASS
#     else:
#         base_dir = os.path.dirname(os.path.abspath(__file__))
#
#     main()


import os
import shutil
import sys


def get_user_input(prompt):
    """安全获取用户输入（兼容中文路径）"""
    try:
        return input(prompt)
    except UnicodeDecodeError:
        return input(prompt.encode('gbk', 'ignore').decode('gbk'))


def classify_and_move_directories(source_root, target_root):
    """
    将数字目录按规则归类

    规则说明：
    - 目录名必须是纯数字且长度>=3
    - 取前 (len(directory_name) - 2) 位作为一级目录
    - 示例:
        2389 (4位) → 23 (4-2=2)
        45678 (5位) → 456 (5-2=3)
        00089123 (8位) → 000891 (8-2=6)
    """
    # 验证源目录是否存在
    if not os.path.exists(source_root):
        print(f"错误: 源目录 '{source_root}' 不存在")
        return

    # 确保目标根目录存在
    if not os.path.exists(target_root):
        os.makedirs(target_root, exist_ok=True)

    # 遍历源目录下的所有子目录
    for dir_name in os.listdir(source_root):
        source_dir = os.path.join(source_root, dir_name)

        # 跳过非目录
        if not os.path.isdir(source_dir):
            continue

        # 验证目录名是否为数字且长度>=3
        if not dir_name.isdigit() or len(dir_name) < 3:
            print(f"跳过: 目录名无效 - {dir_name} (需3位或以上数字)")
            continue

        # 计算一级目录长度 = len - 2
        category_length = len(dir_name) - 2
        if category_length < 1:  # 确保至少1位
            category_length = 1

        # 提取前 category_length 位作为归类目录名
        category_dir = dir_name[:category_length]

        # 构建目标路径
        target_dir = os.path.join(target_root, category_dir, dir_name)

        # 检查目标目录是否已存在
        if os.path.exists(target_dir):
            print(f"跳过: 目录已存在 - {dir_name} -> {target_dir}")
            continue

        # 创建归类目录（如果不存在）
        os.makedirs(os.path.dirname(target_dir), exist_ok=True)

        # 复制目录（包括所有子文件）
        try:
            shutil.copytree(source_dir, target_dir)
            print(f"成功归类: {dir_name} -> {target_dir}")
        except Exception as e:
            print(f"错误: 复制 {dir_name} 时出错 - {str(e)}")


def main():
    """主程序入口"""
    print("=" * 50)
    print("目录归类工具 - 按规则归类")
    print("规则: 取前 (len(directory_name) - 2) 位作为一级目录")
    print("示例: 2389 → 23, 45678 → 456, 00089123 → 000891")
    print("=" * 50)

    # 获取用户输入
    source_root = get_user_input("\n请输入源目录路径 (如 E:\\): ")
    target_root = get_user_input("请输入目标目录路径 (如 E:\\归类结果\\): ")

    # 验证输入
    if not os.path.exists(source_root):
        print(f"\n错误: 源目录 '{source_root}' 不存在！")
        print("请确保路径正确，包含反斜杠和引号（如 E:\\）")
        sys.exit(1)

    # 创建目标根目录（如果不存在）
    if not os.path.exists(target_root):
        # exist_ok 不抛出异常
        os.makedirs(target_root, exist_ok=True)

    # 执行目录归类
    print(f"\n开始处理: 源目录 = {source_root}")
    print(f"目标目录 = {target_root}\n")

    # 统计有效目录
    valid_dirs = []
    for dir_name in os.listdir(source_root):
        dir_path = os.path.join(source_root, dir_name)
        if os.path.isdir(dir_path) and dir_name.isdigit() and len(dir_name) >= 3:
            valid_dirs.append(dir_name)

    print(f"检测到 {len(valid_dirs)} 个有效目录（3位或以上数字）")

    classify_and_move_directories(source_root, target_root)

    print(f"\n目录归类完成！共处理 {len(valid_dirs)} 个目录")


if __name__ == "__main__":
    # 适配PyInstaller打包
    if getattr(sys, 'frozen', False):
        # 没打包 frozen 为假
        base_dir = sys._MEIPASS
        # print(f"运行于打包环境: {base_dir}")
    else:
        # 获取程序运行的目录
        base_dir = os.path.dirname(os.path.abspath(__file__))

    main()